package org.example;

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        ListNode listNode = new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5))));
        System.out.println(main.trainningPlan(listNode));
    }

    // 双指针法
    public ListNode trainningPlan(ListNode head) {
        ListNode cur = head, pre = null;
        while(cur != null) {
            // 暂存后继节点 cur.next
            ListNode tmp = cur.next;
            // 修改 next 引用指向
            cur.next = pre;
            // pre 暂存 cur
            pre = cur;
            // cur 访问下一节点
            cur = tmp;
        }
        return pre;
    }

    // 递归法
    public ListNode trainningPlan2(ListNode head) {
        return recur(head, null);    // 调用递归并返回
    }
    private ListNode recur(ListNode cur, ListNode pre) {
        // 终止条件
        if (cur == null) {
            return pre;
        }
        // 递归后继节点
        ListNode res = recur(cur.next, cur);
        // 修改节点引用指向
        cur.next = pre;
        // 返回反转链表的头节点
        return res;
    }



}